import numpy as np
from scipy import stats
import pandas as pd

# 读取数据
'''
R语言:sweat.data = read.table(file="T5-1.DAT", header=F, col.names=c("sweat.rate", "sodium", "potassium"))
'''
df = pd.read_csv(r'one.csv')
print(df)
# 均值 - 计算每列的平均值
'''
R语言:(mean.vect = apply(sweat.data, 2, mean))
'''
mean = df.mean()

# 协方差
'''
R语言:(cov.matrix = cov(sweat.data))
'''
cov = df.cov()
print(cov)

# 获取行数
'''
shape函数得到数据的总列数和总行数，并以数组的形式返回（行，列），所以获取具体的行数和列数需要加上下标
R语言:n = dim(sweat.data)[1]
'''
line = df.shape[0]

# 获取列数
'''
R语言:p = dim(sweat.data)[2]
'''
column = df.shape[1]

# 加入新向量
'''
mu.0 = c(4, 50, 10)
'''
newVector = np.array([4, 50, 10])

# 计算统计量
'''
R语言:(T.sq = n*t(mean.vect-mu.0)%*%solve(cov.matrix)%*%(mean.vect-mu.0))
matmul函数返回两个数组的矩阵乘积。当两个数组都是二位数组时，就是数学上两个矩阵的乘积
transpose作用是改变序列
numpy.linalg模块包含线性代数的函数。使用这个模块，可以计算逆矩阵、求特征值、解线性方程组以及求解行列式等。
numpy.linalg.inv函数作用是求逆矩阵
'''
statistic = np.matmul(np.matmul(line * np.transpose(mean - newVector), np.linalg.inv(cov)), mean - newVector)
# 置信水平
'''
R语言:alpha=0.1
'''
a = 0.1

'''
scipy.stats模块中有不少涉及计算统计量的子模块
如
scipy.stats.uniform
scipy.stats.norm
scipy.stats.t
scipy.stats.chi2
scipy.stats.f
而其中scipy.stats.f内有如下方法
rvs产生服从制定分布的随机数
pdf概率密度函数
cdf累计分布函数
sf残存函数(1-cdf)
ppf分位点函数（CDF的你函数）
isf逆残存函数
fit对随机取样进行你和，最大似然估计找到的概率密度函数系数...
更多参考：https://blog.csdn.net/q1w2e3r4470/article/details/52742754
'''
# 左分位点 - 临界值
'''
更多参考：https://blog.csdn.net/u012958850/article/details/116605784
R语言:(cut.off=(n-1)*p/(n-p)*qf(1-alpha, p, n-p))
'''
cut = (line - 1) * column / (line - column) * stats.f.ppf(1 - a, column, line - column)
'''
round函数作用是四舍五入
'''
print("统计量=", round(statistic, 6), "临界值=", round(cut, 6))
if statistic > cut:
    print("在a=0.1的置信水平下拒绝原假设")
else:
    print("在a=0.1的置信水平下接受原假设")
